package com.ala4.oxcafe.service;

import com.ala4.oxcafe.boot.page.PageDomain;
import com.ala4.oxcafe.entity.Attachment;
import com.ala4.oxcafe.enums.StorageTypeEnum;
import com.aliyun.oss.dto.OSSUrlDTO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

/**
 * 系统附件存储服务
 *
 * @author PING
 * @date 2025/8/12 22:58
 */
public interface AttachmentService {

    /**
     * 创建一个附件信息
     *
     * @param storageTypeEnum 存储类型
     * @param fileKey         文件key
     * @param fileName        文件名称
     * @param storagePath     存储路径
     */
    void createAttachment(StorageTypeEnum storageTypeEnum, String fileKey, String fileName, String storagePath);

    /**
     * 校验文件的后缀是否符合规则
     *
     * @param fileName 文件名称
     * @return 返回file-key
     */
    void checkFileSuffix(String fileName);

    /**
     * 根据文件filekey获取下载地址
     *
     * @param fileKey
     * @return
     */
    OSSUrlDTO selectDownloadByFileKey(String fileKey);

    /**
     * 获取下载文件地址
     *
     * @param attachment
     * @return
     */
    OSSUrlDTO downloadUrl(Attachment attachment);

    /**
     * 根据文件filekey获取附件
     *
     * @param fileKey
     * @return
     */
    Attachment selectByFileKey(String fileKey);

    /**
     * 本地附件上传
     *
     * @param multipartFile
     */
    Attachment uploadLocalAttachment(MultipartFile multipartFile, String fileKey) throws IOException;

    /**
     * 更新文件大小信息
     *
     * @param fileKey
     * @param size
     */
    Attachment updateAttachment(String fileKey, String size);

    /**
     * 分页查询附件信息
     *
     * @param pageDomain
     * @param attachment
     * @return
     */
    IPage<Attachment> attachmentPage(PageDomain pageDomain, Attachment attachment);

    /**
     * 列表查询附件信息
     *
     * @param attachment
     * @return
     */
    List<Attachment> attachmentList(Attachment attachment);

    /**
     * 保存附件的业务信息
     *
     * @param attachmentList 附件list
     */
    void saveAttachmentList(List<Attachment> attachmentList);

    /**
     * 生成filekey
     *
     * @param fileName
     * @param oss
     * @return
     */
    String generateFileName(String fileName, StorageTypeEnum oss);

    /**
     * 生成文件存储路径
     *
     * @param fileName
     * @return
     */
    String generateFilePath(String fileName);
}
